package com.itheima.controller;

import com.itheima.pojo.Emp;
import com.itheima.pojo.PageBean;
import com.itheima.pojo.Result;
import com.itheima.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.util.List;

/**
 * 员工管理
 */
@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {

    @Autowired
    private EmpService empService;

    /**
     * Controller里接收表单格式的参数
     *  表单格式是：参数名=值&参数名=值&...
     *  接收方式是：
     *      给方法增加形参，一个形参用于接收一个表单参数；
     *          给形参增加@RequestParam("表单参数名")
     *          如果表单参数名 和 方法形参名相同，可以省略此注解
     *  注意事项：一些特殊的表单参数需要特殊处理
     *      1. 日期参数。
     *          SpringBoot框架默认仅支持yyyy/MM/dd格式的
     *          如果提交的表单参数不是这种格式：需要特殊处理，给方法形参加@DateTimeFormat(pattern="日期格式")
     *      2. 参数默认值。
     *          哪个参数需要默认值，就给方法形参上加@RequestParam(defaultValue="默认值")
     *          如果客户端没有提交这个参数的值，将会使用默认值
     */
    @GetMapping
    public Result page(String name, Integer gender,
                       @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
                       @DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end,
                       @RequestParam(defaultValue = "1") Integer page,
                       @RequestParam(defaultValue = "10") Integer pageSize){
        log.info("分页查询，name={}, gender={}, begin={}, end={}, page={}, pageSize={}",
                name, gender, begin, end, page, pageSize);
        PageBean<Emp> pageBean = empService.page(name, gender, begin, end, page, pageSize);

        return Result.success(pageBean);
    }

    @PostMapping
    public Result add(@RequestBody Emp emp){
        log.info("新增员工，emp={}", emp);
        empService.add(emp);

        return Result.success();

    }
    /**
     * Controller里接收特殊的表单参数—数组形式的表单参数
     *     数组形式的表单格式的参数，客户端传参时的格式：
     *     格式1： /emps?ids=1,3,4
     *     格式2： /emps？ids=1&ids=3&ids=4
     *     Controller里接收数组表单参数：
     *     接收方式1：接收成数组
     *     在方法上增加数组类型的形参  Integer[] ids
     *     给形参增加@RequestParam("表单参数名")，如果表单参数名和方法形参名相同，可以省略此注解不写
     *     接收方式2：接收成集合
     *     在方法上增加集合类型的形参  List<Integer> ids
     *     给形参增加@RequestParam("表单参数名")。！！注意：无论方法形参名和表单参数名是否相同，都不能省略此注解！！
     *      因为List是接口，不加注解的话 框架不知道该用List的哪个实现类
     *      而加了@RequestParam注解，框架就会使用ArrayList来接收参数
     */
    @DeleteMapping
    public Result deleteByIds(@RequestParam("ids") List<Integer> ids){
        log.info("删除员工，ids={}",ids);
        empService.deleteByIds(ids);
        return Result.success();
    }
    @GetMapping("/{id}")
    public Result getById(@PathVariable("id") Integer id){
        Emp emp = empService.getById(id);
        return Result.success(emp);
    }

    @PutMapping
    public Result updateById(@RequestBody Emp emp){


        empService.updateById(emp);
        return Result.success();
    }
    @GetMapping("/list")
    public Result list(){
        List<Emp> list = empService.queryAll();
        return Result.success(list);
    }


}